﻿using System;
using System.Collections.Generic;
using System.Text;
using Csla;
using System.Data.Odbc;
using MinaspetroLibrary.Configuracoes;
using System.Data;
using Csla.Data;

namespace MinaspetroLibrary.BoletoPack
{
    [Serializable()]
    public class BoletoListInfo : ReadOnlyListBase<BoletoListInfo, BoletoChildInfo>
    {
        #region Authorization Rules

        public static bool CanGetObject()
        {
            return true;
        }
        #endregion //Authorization Rules

        #region Factory Methods
        private BoletoListInfo()
        { /* require use of factory method */ }

        public static BoletoListInfo GetBoletoListInfo()
        {
            if (!CanGetObject())
                throw new System.Security.SecurityException("Usuário não autorizado a visualizar BoletoListInfo");
            return DataPortal.Fetch<BoletoListInfo>(new FilterCriteria());
        }

        public static BoletoListInfo GetBoletoListInfo(Guid Id)
        {
            if (!CanGetObject())
                throw new System.Security.SecurityException("Usuário não autorizado a visualizar BoletoListInfo");
            return DataPortal.Fetch<BoletoListInfo>(new FilterCriteria(Id));
        }

        public static BoletoListInfo GetBoletoListInfo(string cnpj)
        {
            if (!CanGetObject())
                throw new System.Security.SecurityException("Usuário não autorizado a visualizar BoletoListInfo");
            return DataPortal.Fetch<BoletoListInfo>(new FilterCriteria(cnpj));
        }

        public static BoletoListInfo GetBoletoListInfo(int indexInicio, int quantidade)
        {
            if (!CanGetObject())
                throw new System.Security.SecurityException("Usuário não autorizado a visualizar BoletoListInfo");
            return DataPortal.Fetch<BoletoListInfo>(new FilterCriteria(indexInicio, quantidade));
        }

        #endregion //Factory Methods

        #region Data Access

        #region Filter Criteria
        [Serializable()]
        private class FilterCriteria
        {
            public int IndexInicio = 0;
            public int Quantidade = 0;
            public string Cnpj = string.Empty;
            public Guid Id = Guid.Empty;

            public FilterCriteria()
            {
            }

            public FilterCriteria(string Cnpj)
            {
                this.Cnpj = Cnpj;
            }

            public FilterCriteria(Guid Id)
            {
                this.Id = Id;
            }

            public FilterCriteria(int indexInicio, int quantidade)
            {
                this.IndexInicio = indexInicio;
                this.Quantidade = quantidade;
            }
           
        }
        #endregion //Filter Criteria

        #region Data Access - Fetch
        private void DataPortal_Fetch(FilterCriteria criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;

            using (OdbcConnection cn = new OdbcConnection(ConfigDatabase.MinaspetroConnection))
            {
                cn.Open();

                ExecuteFetch(cn, criteria);
            }//using

            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }

        private void ExecuteFetch(OdbcConnection cn, FilterCriteria criteria)
        {
            using (OdbcCommand cm = cn.CreateCommand())
            {
                cm.CommandType = CommandType.Text;
                cm.CommandText = GetFetchScript(criteria);

                using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
                {
                    while (dr.Read())
                        this.Add(BoletoChildInfo.GetBoletoChildInfo(dr));
                }
            }//using
        }

         string GetFetchScript(FilterCriteria criteria)
        {

            StringBuilder strQuery = new StringBuilder();

            strQuery.Append(" SELECT IdSeq, Id, Cnpj, Valor, Data, NumDocumento, RazaoSocial, ");
            strQuery.Append(" Endereco, Bairro, Cep, Cidade, Estado, DataGerBoleto ");
            strQuery.Append(" FROM boletotb ");

            if (!criteria.Cnpj.Equals(string.Empty) && criteria.Cnpj.Trim().Length > 10)
            {
                strQuery.Append(" WHERE Cnpj = '" + criteria.Cnpj + "' ");
            }
            else if (!criteria.Id.Equals(Guid.Empty) && criteria.Id.ToString().Trim().Length > 10)
            {
                strQuery.Append(" WHERE Id = '" + criteria.Id.ToString() + "' ");
            }

            strQuery.Append(" ORDER BY Data DESC ");

            if (criteria.Quantidade != 0)
                strQuery.Append(" LIMIT " + criteria.IndexInicio + "," + criteria.Quantidade);

            if (!criteria.Cnpj.Equals(string.Empty) && criteria.Cnpj.Trim().Length > 10 && criteria.Quantidade == 0)
                strQuery.Append(" LIMIT 0, 1 ");


            return strQuery.ToString();
        }
        #endregion //Data Access - Fetch
        #endregion //Data Access
    }
}
